#!/usr/bin/env bats

load test_helpers

setup() {
  setup_asdf_dir
  install_dummy_plugin

  PROJECT_DIR="$HOME/project"
  mkdir -p "$PROJECT_DIR"
}

teardown() {
  clean_asdf_dir
}

@test "uninstall_command should fail when no such version is installed" {
  run asdf uninstall dummy 3.14
  [ "$output" = "No such version" ]
  [ "$status" -eq 1 ]
}

@test "uninstall_command should remove the plugin with that version from asdf" {
  run asdf install dummy 1.1.0
  [ "$status" -eq 0 ]
  [ "$(cat "$ASDF_DIR/installs/dummy/1.1.0/version")" = "1.1.0" ]
  run asdf uninstall dummy 1.1.0
  [ ! -f "$ASDF_DIR/installs/dummy/1.1.0/version" ]
}

@test "uninstall_command should invoke the plugin bin/uninstall if available" {
  run asdf install dummy 1.1.0
  [ "$status" -eq 0 ]
  mkdir -p "$ASDF_DIR/plugins/dummy/bin"
  printf '%s\n' "echo custom uninstall" >"$ASDF_DIR/plugins/dummy/bin/uninstall"
  chmod 755 "$ASDF_DIR/plugins/dummy/bin/uninstall"
  run asdf uninstall dummy 1.1.0
  [ "$output" = "custom uninstall" ]
  [ "$status" -eq 0 ]
}

@test "uninstall_command should remove the plugin shims if no other version is installed" {
  run asdf install dummy 1.1.0
  [ -f "$ASDF_DIR/shims/dummy" ]
  run asdf uninstall dummy 1.1.0
  [ ! -f "$ASDF_DIR/shims/dummy" ]
}

@test "uninstall_command should leave the plugin shims if other version is installed" {
  run asdf install dummy 1.0.0
  [ -f "$ASDF_DIR/installs/dummy/1.0.0/bin/dummy" ]

  run asdf install dummy 1.1.0
  [ -f "$ASDF_DIR/installs/dummy/1.1.0/bin/dummy" ]

  [ -f "$ASDF_DIR/shims/dummy" ]
  run asdf uninstall dummy 1.0.0
  [ -f "$ASDF_DIR/shims/dummy" ]
}

@test "uninstall_command should remove relevant asdf-plugin metadata" {
  run asdf install dummy 1.0.0
  [ -f "$ASDF_DIR/installs/dummy/1.0.0/bin/dummy" ]

  run asdf install dummy 1.1.0
  [ -f "$ASDF_DIR/installs/dummy/1.1.0/bin/dummy" ]

  run asdf uninstall dummy 1.0.0
  run grep "asdf-plugin: dummy 1.1.0" "$ASDF_DIR/shims/dummy"
  [ "$status" -eq 0 ]
  run grep "asdf-plugin: dummy 1.0.0" "$ASDF_DIR/shims/dummy"
  [ "$status" -eq 1 ]
}

# Disabled as this test represents an invalid state. A shim (`gummy`) should
# never exist unless it referenced an existing tool and version.
#
#@test "uninstall_command should not remove other unrelated shims" {
#  run asdf install dummy 1.0.0
#  [ -f "$ASDF_DIR/shims/dummy" ]

#  touch "$ASDF_DIR/shims/gummy"
#  [ -f "$ASDF_DIR/shims/gummy" ]

#  run asdf uninstall dummy 1.0.0
#  [ -f "$ASDF_DIR/shims/gummy" ]
#}

@test "uninstall command executes configured pre hook" {
  cat >"$HOME/.asdfrc" <<-'EOM'
pre_asdf_uninstall_dummy = echo will uninstall dummy $1
EOM

  run asdf install dummy 1.0.0
  run asdf uninstall dummy 1.0.0
  [ "$output" = "will uninstall dummy 1.0.0" ]
}

@test "uninstall command executes configured post hook" {
  cat >"$HOME/.asdfrc" <<-'EOM'
post_asdf_uninstall_dummy = echo removed dummy $1
EOM

  run asdf install dummy 1.0.0
  run asdf uninstall dummy 1.0.0
  [ "$output" = "removed dummy 1.0.0" ]
}
